//
// Created by PC on 2024/7/2.
// GESP 2024.06 五级 编程第一题
// 这道题的简单版本见 202406 gesp四级题
// OJ:https://www.luogu.com.cn/problem/P10719
// 部分通过, 只扫描每一行有没有出现最小子矩阵(一维),不能实现二维矩阵
// 讲解:【GESP2024年6月五级真题解析】51'20'' https://www.bilibili
// .com/video/BV12E421A7gx/?share_source=copy_web&vd_source=039990b6433b5af9bd2905234cc47ac6
/*
 * 试题名称：黑白格
时间限制：1.0 s
内存限制：512.0 MB
3.1.1 题面描述
小杨有一个n行m列的网格图，其中每个格子要么是白色，要么是黑色。
小杨想知道至少包含k个黑色格子的最小子矩形包含了多少个格子。
3.1.2 输入格式
第一行包含三个正整数 nmk，含义如题面所示。
之后n行，每行一个长度为m的01串，代表网格图第i行格子的颜色，如果为0，则对应格子为白色，否则为黑
色。
3.1.3 输出格式
输出一个整数，代表至少包含k个黑色格子的最小子矩形包含格子的数量，如果不存在则输出0。
3.1.4 样例1
 4 5 5
 00000
 01111
 00011
 00011
 output: 6
3.1.5 样例解释
对于样例1，假设 (i,j ) 代表第i行第j列，至少包含5个黑色格子的最小子矩形的四个顶点为
 (2,4 )，(2,5 )，(4,4 )，(4,5 )，共包含6 个格子。
3.1.6 数据范围
 20% n,m<=10
 40% n=1,1<=m<=100
 40% n,m<=100
对于全部数据，保证有 1<=n,m<=100,1<=k<=n*m。
input:
1
15
6
01110111111000
output:
6

input:
1
15
6
011101100111111
output:
6
 * */

#include <iostream>
#include <vector>

using namespace std;

// 读取一个字符串, 看看单行符合最小矩阵的大小
int readLine(string a, int k)
{
    int m = a.size();
    int ans = m + 1;
    for (int i = 0; i < m - k; ++i)
    {
        int ii = i;
        // count: 记录这一段的长度 countone记录这一段里1出现的次数
        int count = 0, countone = 0;
        // 跳过前边的0
        while (a[ii] != '1')
            ++ii;
        for (int j = ii; j < m && countone < k; ++j)
        {
            ++count;
            // 从第一个遇到的1开始遍历,并计数, 直到1的个数为k 或者 到尾部为止
            if (a[j] == '1')
                countone++;
        }
        // 如果 1的数量达到k, 并且 count小于ans
        if (countone >= k && count < ans)
            ans = count;
    }
    if (ans == m + 1)
        return 0;
//        cout << 0 << endl;
    else
        return ans;
//        cout << ans << endl;
}

int main()
{
    // n:行数 m:列数 k至少包含黑格子的数
    int n = 1, m = 15, k = 6;
    cin >> n >> m >> k;
//    string netmap[n];
    vector<string> netmap;
//    netmap.push_back("011101111110000");
//    netmap.push_back("011101110110000");
    for (int i = 0; i < n; ++i)
    {

        string t;
        cin >> t;
        netmap.push_back(t);
    }
    int ret = 1e9;  // ret是输出的结果, 这里将ret设置成一个大值
    // 数组第二维度, 也就是选择不同的字符串
    for (int x = 0; x < netmap.size(); ++x)
    {
//        cout << readLine(netmap[x], k) << endl;
        ret=min(ret,readLine(netmap[x], k));
/*        // 每一个字符串起始位置 每层循环要往后一个
        for (int y = 0; y < netmap[x].size(); ++y)
        {
            // 控制字符串读取到哪里截止
            for (int i = 0; i < netmap[x].size(); ++i)
            {
                for (int j = y; j <= i; ++j)
                {
            cout<<netmap[i][j]<<' ';
                    cout << netmap[x][j];
                }
                cout << endl;
            }

        }*/

    }
    cout<<ret;
    return 0;
}
